\chapter{Implementação}

\section{Introdução}

Enquadramento geral do projecto, objectivos a atingir e identificação das tarefas que foram objecto de implementação.

\section{Decisões Globais de Implementação}

\subsection{Tecnologias Utilizadas}
Para este projecto foi escolhida a linguagem de programação PHP com ligação a base de dados MySQL, é utilizado o principio de programação orientada a objectos com um modelo de arquitectura Model-View-Controller (MVC).\\
Para a ligação entre o PHP e o MySQL é utilizada a extenção MySQLi.
Para a criação das páginas a apresentar ao utilizador foi implementado o sistema de gestão de templates para PHP - Smarty (versão 3.1). E também o API de Javascript - jQuery (versão jquery-1.3.1).

\subsection{Armazenamento dos Dados}
Os dados utilizados pela aplicação são armazenados na base de dados local (mySQL) e quando um utilizador acede ao site é criada uma sessão em PHP que guarda, temporariamente, os dados necessários para manter o utilizador logado bem como as datas escolhidas (inicial, final e actual).

\subsection{Hierarquia de Ficheiros}
Os ficheiros com os controladores estão colocados na directoria \textit{``controller"}, os do modelo na directoria \textit{``model"}, da vista na directoria \textit{``view"}. As folhas de estilo (``CSS") dentro da directoria \textit{``css"}, os elementos gráficos são colocados dentro de \textit{``imagens"}. Todos os ficheiros com as bibliotecas javascript ou funções criadas para este site ficam dentro da directoria \textit{``js"}. Por fim os ficheiros utilizados pelo Smarty para apresentação de html ficam dentro da directoria \textit{``templates"}.\\
As classes utilizadas no site estão fisicamente localizadas em ficheiros de extensão PHP com o mesmo nome da respectiva classe.\\

\section{Decisões de Implementação Específicas}
\subsection{Ligação à Base de Dados}
O controlador principal do site está no ficheiro \code{MainController.php}, no seu construtor é criado um objecto que servirá de ligação à base de dados. esse objecto é da classe de modelo \code{BD}. Esta classe aceita no seu construtor o endereço do servidor onde a base de dados está armazenada, o nome de utilizador, password e o nome da base de dados. Com esses dados o sistema efectua a ligação.\\
Quando a execução do código termina, esta classe fecha a conexão com a base de dados através do seu método \code{\_\_destruct}.\\
A classe para ligação à base de dados contém vários métodos dos quais se podem aqui destacar o método \code{multiQuery} que permite obter resultados que uma chamada de uma stored procedure que retorne mais que uma linha. Para consultas ``normais" existem os métodos \code{query} que retorna os resultados num array, \code{execute} para executar querys que não retornem resultados e o \code{getRow} que apenas retorna uma linha.

\subsection{Funcionamento do controlador principal}
O controlador principal \code{MainController} começa por criar uma sessão \code{PHP} no servidor, criar os objectos para a ligação à base de dados, vista e dois objectos para controladores ``secundários": \code{UserController} e \code{CalendarController}.\\
De seguida executa a acção pretendida pelo utilizador através do método \code{actions}, este método verifica no array \code{\$\_GET} as variáveis recebidas sendo que o primeiro será a classe a utilizar e os seguintes serão os métodos com o respectivo parâmetro.\\
Por exemplo, para um acesso com \code{\?Calendar\&setDay=20131023}, é executado o método \code{setDay(20131023)} da classe \code{CalendarController}.

\subsection{Login}
Sempre que o utilizador acede ao site é criado um objecto da classe \code{UserController} que recebe no seu construtor o objectos da ligação à base de dados e da vista. É então criado o \code{user} da classe de modelo \code{User} e executado o método \code{login}. Este método verifica se foi submetido o formulário de login, sendo que o tenha sido executa o método \code{login} do \code{user} com o username e password recebidos como parâmetros, caso não tenha sido submetido o formulário o método é chamado sem parâmetros.\\
Os objectos da classe \code{User} contêm três objectos das classes de modelo \code{Coordinator}, \code{Teacher} e \code{Student}, o seu construtor executa também o método da própria classe \code{login}. Este método, verifica se recebe parâmetros, caso não tenha recebido, executa o método \code{setUser}, caso tenha recebido, executa um query para confirmar a existência de um utilizador com os dados recolhidos.\\
Após estar definido, ou não, o utilizador é executado o método \code{setCourses}.\\
Este método começa por chamar o método \code{getCourses} do objecto da classe \code{BD} que por sua vez executa a stored procedure \code{get_cursos_user} que retorna a lista de cursos a que o utilizador está associado, para cada um deles será adicionado ao objecto correspondente ao papel do utilizador em questão o respectivo curso.\\
Para cada curso é obtida a lista de disciplinas que está associada ao utilizador com o papel do mesmo. A partir da lista obtida é adicionada ao curso a mesma.\\
Por fim, para cada disciplina obtida sao consultadas as avaliações da mesma, associadas ao utilizador e são adicionadas ao objecto da Disciplina criado.\\

\subsection{Logout}
Quando um utilizador efectua o logout, todas as variáveis do objecto da classe modelo \code{User} e executa o método \code{clear} de cada uma das classes dos papéis possiveis. Estas classes herdam da classe \code{Role} que contem os métodos comuns a todas. Este método esvazia o array com os cursos.

\subsection{Listar Avaliações}
O sistema após ter feito as tarefas de verificar que utilizador está logado e quais os cursos, disciplinas e avaliações a ele estão associados, executa as acções solicitadas pelo método \code{GET}. Terminadas estas tarefas o \code{MainController} executa de novo o método \code{setCourses} no \code{UserController} que por sua vez delega a execução no \code{User}.\\
Após isso solicita ao controlador \code{CalendarController} quais as datas, inicial e final, definidas e solicita ao \code{UserController} as avaliações contidas nesse intervalo de datas. O controlador solicita as avaliações no intervalo ao \code{Usert} que por sua vez solicita a cada um dos \code{Role}, estes obtêm a lista a partir de cada um dos \code{Course}, que interrogam as suas \code{Discipline} que por sua vez retornam todas as \code{Evaluation} cuja data esteja dentro do intervalo pretendido.\\
Esses dados são passados à \code{View} que apresenta o resultado ao utilizador com auxílio do template engine \textit{Smarty}.

\subsection{Ver Detalhes de Avaliação}
Os detalhes das avaliações são apresentados ao ser seleccionado um dia no calendário. Sempre que o utilizador acede ao site, o \code{CalendarController} cria um novo objecto da classe de modelo \code{Calendar}.\\
No seu construtor é de imediato definida a data inicial, data final e o dia actual, que poderá ser o dia em que o acesso é feito ao sistema ou dia escolhido no calendário. Sempre que o código deixa de ser executado no servidor o método \code{__destruct} desta classe armazena em variáveis da sessão actual as datas. Essas variáveis serão sempre utilizadas a cada acesso para a definição das mesmas, caso não haja interacção do utilizador a esse nível.\\
Com a data actual adquirida o \code{MainController} solicita ao \code{UserController} as avaliações associadas ao \code{User} para esse dia.\\
Obtida a lista, a mesma é passada à classe de modelo \code{Details}, que organiza a informação por forma a ser facilmente utilizada pelo Smarty que apresenta os detalhes das mesmas, apresentando os comandos possiveis a cada uma de acordo com o \code{Role} associado ao \code{User}.
 
\subsection{Marcar Avaliação}
A marcação de uma avaliação é uma acção que é encaminhada para o \code{UserController} e chamado o método \code{newEvaluation}.\\
Neste método é verificado se foi submetido o formulário para a inserção da nova avaliação, em caso afirmativo o controlador adiciona a avaliação ao \code{User} através do método \code{newEvaluation} que por sua vez executa a stored procedure \code{add_evaluation}, como já foi explicado anteriormente a stored procedure verifica se o utilizador tem a permissão para criar tal avaliação.\\
Caso não tenha sido submetido o formulário, o controlador questiona à classe \code{User} quais as disciplinas que o \code{User} tem como \code{Role: Teacher} através do método \code{getTeaching} da classe \code{User}. A variável \code{teaching} é definida no \code{login}, ou seja logo quando o \code{User} é criado em que question a classe \code{BD} quais as disciplinas em que o \code{User} é \code{Teacher}. Sempre que esta variável contém alguma disciplina o menu do site apresenta o item \textit{``nova avaliação"}.\\
Obtidos os dados é apresentado o formulário ao utilizador com uma caixa de selecção onde são apresentadas as disciplinas onde o utilizador é docente.

\subsection{Cancelar Avaliação}
Ao cancelar uma avaliação o \code{UserController} solicita o objecto \code{Teacher} ao \code{User} e executa nesse objecto o método \code{cancelEvaluation}, desta forma apenas poderá ser cancelada uma avaliação em que o \code{User} é \code{Teacher}.


\subsection{Validar e Cancelar Validação de Avaliação}
A validação da avaliação é feita de forma semelhante à anterior, mas deta forma o controlador solicita ao \code{User} o objecto \code{Coordinator} e executa o seu método \code{validate} ou \code{unvalidate} conforme a situação.

\subsection{Inscrever e Cancelar Inscrição em Avaliação}
A inscrição numa avaliação é feita com o \code{UserController} a solicitar ao \code{User} o objecto \code{Student} e executando o seu método \code{inscribe} ou \code{uninscribe} conforme a acção pretendida.